home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2005 October / PCWOCT05.iso / Software / FromTheMag / XAMPP 1.4.14 / xampp-win32-1.4.14-installer.exe / xampp / php / pear / MDB / QueryTool / EasyJoin.php next >
PHP Script  |  2004-03-24  |  6KB  |  130 lines

  1. <?php
  2. // +----------------------------------------------------------------------+
  3. // | PHP Version 4                                                        |
  4. // +----------------------------------------------------------------------+
  5. // | Copyright (c) 1997-2003 The PHP Group                                |
  6. // +----------------------------------------------------------------------+
  7. // | This source file is subject to version 2.02 of the PHP license,      |
  8. // | that is bundled with this package in the file LICENSE, and is        |
  9. // | available at through the world-wide-web at                           |
  10. // | http://www.php.net/license/2_02.txt.                                 |
  11. // | If you did not receive a copy of the PHP license and are unable to   |
  12. // | obtain it through the world-wide-web, please send a note to          |
  13. // | license@php.net so we can mail you a copy immediately.               |
  14. // +----------------------------------------------------------------------+
  15. // | Author: Lorenzo Alberton <l.alberton at quipo.it>                    |
  16. // +----------------------------------------------------------------------+
  17. //
  18. // $Id: EasyJoin.php,v 1.6 2004/03/18 10:25:20 quipo Exp $
  19. //
  20. // This is just a port of DB_QueryTool, originally written by
  21. // Wolfram Kriesing and Paolo Panto, vision:produktion <wk@visionp.de>
  22. // All the praises go to them :)
  23. //
  24. /**
  25.  * Load MDB_QueryTool_Query class
  26.  */
  27. require_once 'MDB/QueryTool/Query.php';
  28.  
  29. /**
  30.  *
  31.  *   @package    MDB_QueryTool
  32.  *   @author     Lorenzo Alberton <l.alberton@quipo.it>
  33.  *   @access     public
  34.  */
  35. class MDB_QueryTool_EasyJoin extends MDB_QueryTool_Query
  36. {
  37.     /**
  38.      * call parent constructor
  39.      * @param mixed $dsn DSN string, DSN array or MDB object
  40.      * @param array $options
  41.      */
  42.     function __construct($dsn=false, $options=array())
  43.     {
  44.         parent::MDB_QueryTool_Query($dsn, $options);
  45.     }
  46.  
  47.     /**
  48.      * this is the regular expression that shall be used to find a table's
  49.      * shortName in a column name, the string found by using this regular
  50.      * expression will be removed from the column name and it will be checked
  51.      * if it is a table name i.e. the default '/_id$/' would find the table name
  52.      * 'user' from the column name 'user_id'
  53.      */
  54.     var $_tableNamePreg = '/_id$/';
  55.  
  56.     /**
  57.      * this is to find the column name that is refered by it, so the default
  58.      * find from 'user_id' the column 'id' which will be used to refer to the
  59.      * 'user' table
  60.      */
  61.     var $_columnNamePreg = '/^.*_/';
  62.  
  63.     /**
  64.      * join the tables given, using the column names, to find out how to join
  65.      * the tables this is, if table1 has a column names table2_id this method
  66.      * will join WHERE table1.table2_id=table2.id
  67.      * all joins made here are only concatenated via AND
  68.      */
  69.     function autoJoin($tables)
  70.     {
  71. // FIXXME if $tables is empty autoJoin all available tables that have a relation to $this->table, starting to search in $this->table
  72.         settype($tables, 'array');
  73.         // add this->table to the tables array, so we go thru the current table first
  74.         $tables = array_merge(array($this->table), $tables);
  75.  
  76.         $shortNameIndexed = $this->getTableSpec(true,  $tables);
  77.         $nameIndexed      = $this->getTableSpec(false, $tables);
  78.  
  79. //print_r($shortNameIndexed);
  80. //print_r($tables);        print '<br /> <br />';
  81.         if(sizeof($shortNameIndexed) != sizeof($tables)) {
  82.             $this->_errorLog('autoJoin-ERROR: not all the tables are in the tableSpec!<br />');
  83.         }
  84.         $joinTables     = array();
  85.         $joinConditions = array();
  86.         foreach($tables as $aTable) {
  87.             // go through $this->table and all the given tables
  88.             if($metadata = $this->metadata($aTable)) {
  89.                 foreach($metadata as $aCol => $x) {
  90.                     // go through each row to check which might be related to $aTable
  91.                     $possibleTableShortName = preg_replace($this->_tableNamePreg, '', $aCol);
  92.                     $possibleColumnName = preg_replace($this->_columnNamePreg, '', $aCol);
  93. //print "$aTable.$aCol .... possibleTableShortName=$possibleTableShortName .... possibleColumnName=$possibleColumnName<br />";
  94.                     if(!empty($shortNameIndexed[$possibleTableShortName])) {
  95.                         // are the tables given in the tableSpec?
  96.                         if(!$shortNameIndexed[$possibleTableShortName]['name'] ||
  97.                            !$nameIndexed[$aTable]['name'])
  98.                         {
  99.                             // its an error of the developer, so log the error, dont show it to the end user
  100.                             $this->_errorLog("autoJoin-ERROR: '$aTable' is not given in the tableSpec!<br />");
  101.                         } else {
  102.                             // do only join different table.col combination,
  103.                             // we should not join stuff like 'question.question=question.question' this would be quite stupid, but it used to be :-(
  104.                             if ($shortNameIndexed[$possibleTableShortName]['name'].$possibleColumnName!=$aTable.$aCol) {
  105.                                 $joinTables[]     = $nameIndexed[$aTable]['name'];
  106.                                 $joinTables[]     = $shortNameIndexed[$possibleTableShortName]['name'];
  107.                                 $joinConditions[] = $shortNameIndexed[$possibleTableShortName]['name'].".$possibleColumnName=$aTable.$aCol";
  108.                             }
  109.                         }
  110.                     }
  111.                 }
  112.             }
  113.         }
  114.  
  115.         if(sizeof($joinTables) && sizeof($joinConditions)) {
  116.             $joinTables = array_unique($joinTables);
  117.             foreach($joinTables as $key => $val) {
  118.                 if($val == $this->table) {
  119.                     unset($joinTables[$key]);
  120.                 }
  121.             }
  122. //FIXXME set tables only when they are not already in the join!!!!!
  123. //print_r($joinTables); echo '$this->addJoin('.implode(' AND ',$joinConditions).');<br />';
  124.             $this->addJoin($joinTables,implode(' AND ', $joinConditions));
  125.         }
  126. //print '<br /> <br /> <br />';
  127.     }
  128.  
  129. }
  130. ?>